package 算法.模拟;

import java.util.Arrays;
import java.util.HashMap;

public class JZ61扑克牌顺子 {
    //哈希表
    public boolean IsContinuous(int [] numbers) {
        HashMap<Integer, Integer> hash = new HashMap<>();
        //设置顺子上下界
        int max = 0, min = 13;
        //遍历牌
        for(int i = 0; i < numbers.length; i++){
            if(numbers[i] > 0){
                //顺子不能重复
                if(hash.containsKey(numbers[i]))
                    return false;
                else{
                    //将新牌加入哈希表
                    hash.put(numbers[i], i);
                    //更新上下界
                    if(numbers[i] >= max)
                        max = numbers[i];
                    if(numbers[i] <= min)
                        min = numbers[i];
                }
            }
        }
        //如果两张牌大于等于5，剩下三张牌无论如何也补不齐
        if((max - min) >= 5)
            return false;
        else
            return true;
    }

    //排序法
    public boolean IsContinuous2(int [] numbers) {
        //先排序
        Arrays.sort(numbers);
        int zero = 0;
        int gap = 0;
        for(int i = 0; i < numbers.length - 1; i++){
            //统计零牌数
            if(numbers[i] == 0)
                zero++;
            else{
                //不可重复
                if(numbers[i + 1] - numbers[i] == 0)
                    return false;
                else
                    //统计间隔数
                    gap += numbers[i + 1] - numbers[i] - 1;
            }
        }
        //比较间隔与零牌数
        if(gap > zero)
            return false;
        else
            return true;
    }
}
